package com.example.demo.multiThread.threadPool;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 创建线程池：使用 Executors.newFixedThreadPool(5) 创建一个固定大小为 5 的线程池。
 * 提交任务：通过 executorService.execute() 方法将任务提交到线程池中执行。
 * 关闭线程池：调用 shutdown() 方法平滑地关闭线程池，不再接受新任务，但会完成已提交的任务。
 * 等待任务完成：使用 awaitTermination() 方法等待所有任务完成，超时后会强制关闭线程池。
 */
public class ThreadPoolExample {

    public static void main(String[] args) {

        // 创建一个固定大小的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        // 提交任务到线程池
        for (int i = 1; i <= 10; i++) {
            int taskId = i;
            executorService.execute(() -> {
                System.out.println("任务 " + taskId + " 正在由线程 " + Thread.currentThread().getName() + " 执行");
                try {
                    // 模拟任务执行时间
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("任务 " + taskId + " 执行完成");
            });
        }

        // 关闭线程池
        executorService.shutdown();
        try {
            // 等待所有任务完成
            if (!executorService.awaitTermination(1, TimeUnit.HOURS)) {
                executorService.shutdownNow(); // 如果超时则强制关闭
            }
        } catch (InterruptedException e) {
            executorService.shutdownNow();
        }
    }
}
